package com.mmaingenieria.MMAGestor.controller.usuarios;

import java.io.IOException;
import java.util.ArrayList;
import org.apache.log4j.Logger;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mmaingenieria.MMAGestor.beans.Cliente;
import com.mmaingenieria.MMAGestor.beans.Mensaje;
import com.mmaingenieria.MMAGestor.beans.Usuario;
import com.mmaingenieria.MMAGestor.controller.InitServlet;
import com.mmaingenieria.MMAGestor.enumerations.TipoMensaje;
import com.mmaingenieria.MMAGestor.listeners.Listener;
import com.mmaingenieria.MMAGestor.utils.Tools;

public class GestionUsuariosServlet extends InitServlet {
	private static final long serialVersionUID = 1L;

       
    public GestionUsuariosServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		super.doGet(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try{
			super.doPost(request, response, true);//miro si hay usuario logeado.
			if (super.usuarioLogueado){//si hay usuario logeado ejecuto el dopost
				String op_usuarios = (String)request.getParameter("op_usuarios");//recojo la opcion con la que viene para saber si tengo que hacer una cosa u otra
				if (op_usuarios !=null && op_usuarios.equals("2")){//si mandan la opcion 2 tengo que ir a la ventana de usaurioDetaale.jsp con los campos en blanco (crear nuevo usuario)
					nuevoUsuario(request,response);
				}
				else if (op_usuarios !=null && op_usuarios.equals("3")){//si mandan la opcion 3 tengo que ir a la ventana de usaurioDetaale.jsp con los campos del usuario (mostar usuario)
					mostrarUsuario(request, response, Integer.parseInt(request.getParameter("usuario_id")));//lamo al metodo mostrar usuario con el id que me envian
				}
				else if (op_usuarios != null && op_usuarios.equals("4")){//si mandan 4 es porque hay que borrar usuario
					eliminarUsuario(request,response);
				}
				else if (op_usuarios != null && op_usuarios.equals("5")){//si mandan 5 es porque hay que crear usuario
					int id = crearUsuario(request, response);
					mostrarUsuario(request, response, id);
					Logger.getLogger(this.getClass()).info("Usuario creado y mostrado correctamente");
				}
				else if (op_usuarios !=null && op_usuarios.equals("6")){ //si mandan la opcion 6 tengo que modificar un usuario y volver a mostralo
					modificarUsuario(request, response);
					mostrarUsuario(request,response, Integer.parseInt(request.getParameter("usuario_id")));
				}
				else if (op_usuarios !=null && op_usuarios.equals("7")){ //si mandan la opcion 7 tengo que ir a la ventana de editar un usuario
					editarUsuario(request, response, Integer.parseInt(request.getParameter("usuario_id")));
				}
				else if (op_usuarios !=null && op_usuarios.equals("8")){ //si mandan la opcion 8 tengo que filtrar
					FiltroUsuarios filtro = new FiltroUsuarios();
					filtro.setNombre(request.getParameter("nombre"));
					ArrayList<Usuario> _listaUsuarios = Listener.modeloUsuario.filtrarUsuarios(filtro);
					request.setAttribute("listaUsuarios", _listaUsuarios);
					super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_listar_usuarios"));
					Logger.getLogger(this.getClass()).info("El usuario " + super.usuarioSesion.getUsuario() + " está filtrando usuarios");
				}else{ //la opcion por defecto, es listar todos los usuarios, es decir, si no mandan op listo (seria op=1)
					mostrarListaUsuarios(request,response);
				}				
			}else{//si no hay usuario logueado me voy a fin sesion.
				super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_finSesion"));
			}
			super.dispatcher.forward(request, response);
		}catch (Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada gestionando usuarios");
			try{
				mostrarListaUsuarios(request,response);
				super.dispatcher.forward(request, response);
			}catch(Exception e1){				
				super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_error"));//le dirijo a la pagina de error
			    super.dispatcher.forward(request, response);//Le digo que vaya
			}
		}
	}
	// Metodo para mostrar detalle de usuario por id
	protected void mostrarUsuario (HttpServletRequest request, HttpServletResponse response, int _usuario_id) throws Exception{
		try{
			Usuario usuarioMostrar = Listener.modeloUsuario.obtenerUsuario(_usuario_id);//obtengo al usuario por su id					
			ArrayList<Cliente> listaClientes = Listener.modeloCliente.listarClientes();//cojo la lista de clientes para el combo de clientes
			request.setAttribute("listaClientes", listaClientes);//envio la lista de clinetes
			request.setAttribute("usuario",usuarioMostrar);//envio al usuario
			request.setAttribute("op_usuarios", "3");//envio la opcion de mostrar detalle para que el jsp sepa que campos mostrar y habilitar
			super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_detalle_usuario"));//le digo la ruta que debe de tomar
			Logger.getLogger(this.getClass()).info("El usuario " + super.usuarioSesion.getUsuario() + " está mostrando al usuario: " + usuarioMostrar.getNombre());
		}catch(Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada mostrando usuario");
			throw e;
		}
	}
	// Metodo para ir a la vista de detalle Usuario con los campos vacios para crfear un usuario nuevo
	protected void nuevoUsuario (HttpServletRequest request, HttpServletResponse response) throws Exception{
		try{
			request.setAttribute("op_usuarios", "2");//envio la opcion de mostrar nuevo para que el jsp sepa que campos mostrar y habilitar
			ArrayList<Cliente> listaClientes = Listener.modeloCliente.listarClientes();//cojo la lista de clientes para el combo de clientes
			request.setAttribute("listaClientes", listaClientes);//envio la lista de clinetes
			super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_detalle_usuario"));
			Logger.getLogger(this.getClass()).info("El usuario " + super.usuarioSesion.getUsuario() + " va a crear un usuario nuevo");
		}catch(Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada al ir a crear un nuevo usuario");
			throw e;
		}
	}
	// Metodo para mostrar detalle de usuario por id
	protected void editarUsuario (HttpServletRequest request, HttpServletResponse response, int _usuario_id) throws Exception{
		try{
			Usuario usuarioEditar = Listener.modeloUsuario.obtenerUsuario(_usuario_id);//obtengo al usuario por su id					
			ArrayList<Cliente> listaClientes = Listener.modeloCliente.listarClientes();//cojo la lista de clientes para el combo de clientes
			request.setAttribute("listaClientes", listaClientes);//envio la lista de clinetes
			request.setAttribute("usuario",usuarioEditar);//envio al usuario
			request.setAttribute("op_usuarios", "6");//envio la opcion de editar detalle para que el jsp sepa que campos mostrar y habilitar
			super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_detalle_usuario"));//le digo la ruta que debe de tomar
			Logger.getLogger(this.getClass()).info("El usuario " + super.usuarioSesion.getUsuario() + " va a modificar al usuario: " + usuarioEditar.getNombre());
		}catch(Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada llendo a editar usuario");
			throw e;
		}
	}
	//Metodo para crear un usuario nuevo y devolver el Id con el que se ha creado
	protected int crearUsuario (HttpServletRequest request, HttpServletResponse response) throws Exception{
		try{
			Usuario usuarioNuevo=new Usuario();
			usuarioNuevo.setUsuario(request.getParameter("usuario"));
			usuarioNuevo.setPassword(Tools.encryptMD5(request.getParameter("password")));
			usuarioNuevo.setNombre(request.getParameter("nombre"));
			usuarioNuevo.setApellido1(request.getParameter("apellido1"));
			usuarioNuevo.setApellido2(request.getParameter("apellido2"));
			usuarioNuevo.setNif(request.getParameter("nif"));
			usuarioNuevo.setEmail(request.getParameter("email"));
			usuarioNuevo.setUsuario(request.getParameter("usuario"));
			usuarioNuevo.setRol(Integer.parseInt(request.getParameter("rol")));
			usuarioNuevo.setEstado(Integer.parseInt(request.getParameter("estado")));
			//Si llega null (no pertenece a ningun cliente) le paso 0 ya que un int no puede ser null
        	// despues en MySQLUsuarioDAO miro si es cero, y si es cero lo introduzco en la tabla como null
        	if (request.getParameter("cliente_id") == null){
        		usuarioNuevo.setClienteId(Integer.parseInt("0"));
        	}else{
        		usuarioNuevo.setClienteId(Integer.parseInt(request.getParameter("cliente_id")));
        	}
        	usuarioNuevo.setObservaciones(request.getParameter("observaciones"));
        	usuarioNuevo.setCreatedBy(super.usuarioSesion.getId());
        	java.util.Date fechaActual = new java.util.Date();
        	usuarioNuevo.setModifiedBy(super.usuarioSesion.getId());
        	java.sql.Timestamp fechaCreado = new java.sql.Timestamp(fechaActual.getTime());
        	usuarioNuevo.setDateCreated(fechaCreado);		
			int id = Listener.modeloUsuario.crearUsuario(usuarioNuevo);
			Mensaje msg =new Mensaje(TipoMensaje.Exito);
			msg.addMensaje("El usuario se ha creado correctamente.");
			request.setAttribute("msg", msg);
			Logger.getLogger(this.getClass()).info("El usuario " + super.usuarioSesion.getUsuario() + " ha creado un nuevo usuario con Id: " + id);
			return id;
		}catch (Exception e){
			Mensaje msg =new Mensaje(TipoMensaje.Error);
			msg.addMensaje("El usuario no se ha podido crear. Intentelo de nuevo o contacte con su administrador.");
			request.setAttribute("msg", msg);
			Logger.getLogger(this.getClass()).error("Excepcion generada creando usuario");
			throw e;
		}
	}
	//Metodo para borrar un usuario y
	protected void eliminarUsuario (HttpServletRequest request, HttpServletResponse response) throws Exception{
		try{
			int usuario_id = Integer.parseInt(request.getParameter("usuario_id"));		
			boolean correcto = Listener.modeloUsuario.borrarUsuario(usuario_id);
			if (correcto){
				mostrarListaUsuarios(request,response);
				Mensaje msg =new Mensaje(TipoMensaje.Exito);
				msg.addMensaje("El usuario se ha borrado correctamente.");
				request.setAttribute("msg", msg);
				Logger.getLogger(this.getClass()).info("El usuario " + super.usuarioSesion.getUsuario() + " ha borrado al usuario on Id: " + usuario_id);
			}else{
				mostrarListaUsuarios(request,response);
				Mensaje msg =new Mensaje(TipoMensaje.Error);
				msg.addMensaje("El usuario no se puede eliminar por tener acciones asociadas.");
				request.setAttribute("msg", msg);
				Logger.getLogger(this.getClass()).info("El usuario " + super.usuarioSesion.getUsuario() + " no ha podido borrar al usuario on Id: " + usuario_id);
			}
			
		}catch (Exception e){
			Mensaje msg =new Mensaje(TipoMensaje.Error);
			msg.addMensaje("El usuario no se ha podido borrar. Intentelo de nuevo o contacte con su administrador.");
			request.setAttribute("msg", msg);
			Logger.getLogger(this.getClass()).error("Excepcion generada eliminando usuario");
			throw e;
		}
	}
	
	//Metodo para modificar un usuario
	protected void modificarUsuario (HttpServletRequest request, HttpServletResponse response) throws Exception{
		try{
			Usuario usuarioModificado=new Usuario();
			usuarioModificado.setId(Integer.parseInt(request.getParameter("usuario_id")));
			usuarioModificado.setUsuario(request.getParameter("usuario"));
			usuarioModificado.setNombre(request.getParameter("nombre"));
			usuarioModificado.setApellido1(request.getParameter("apellido1"));
			usuarioModificado.setApellido2(request.getParameter("apellido2"));
			usuarioModificado.setNif(request.getParameter("nif"));
			usuarioModificado.setEmail(request.getParameter("email"));
			usuarioModificado.setUsuario(request.getParameter("usuario"));
			usuarioModificado.setRol(Integer.parseInt(request.getParameter("rol")));
			usuarioModificado.setEstado(Integer.parseInt(request.getParameter("estado")));
			//Si llega null (no pertenece a ningun cliente) le paso 0 ya que un int no puede ser null
        	// despues en MySQLUsuarioDAO miro si es cero, y si es cero lo introduzco en la tabla como null
        	if (request.getParameter("cliente_id") == null){
        		usuarioModificado.setClienteId(Integer.parseInt("0"));
        	}else{
        		usuarioModificado.setClienteId(Integer.parseInt(request.getParameter("cliente_id")));
        	}
        	usuarioModificado.setObservaciones(request.getParameter("observaciones"));
        	usuarioModificado.setModifiedBy(super.usuarioSesion.getId());		
        	Listener.modeloUsuario.modificarUsuario(usuarioModificado);
        	Mensaje msg =new Mensaje(TipoMensaje.Exito);
        	msg.addMensaje("El usuario se ha modificado correctamente.");
			request.setAttribute("msg", msg);
        	Logger.getLogger(this.getClass()).info("El usuario " + super.usuarioSesion.getUsuario() + " ha modificado al usuario: " + usuarioModificado.getId());
		}catch (Exception e){
			Mensaje msg =new Mensaje(TipoMensaje.Error);
			msg.addMensaje("El usuario no se ha podido modificar. Intentelo de nuevo o contacte con su administrador.");
			request.setAttribute("msg", msg);
			Logger.getLogger(this.getClass()).error("Excepcion generada modificando usuario");
			throw e;
		}
	}
	//Metodo que muestra la lista de usuarios
	protected void mostrarListaUsuarios(HttpServletRequest request, HttpServletResponse response) throws Exception{
		try{
			ArrayList<Usuario> _listaUsuarios = Listener.modeloUsuario.listarUsuarios(super.usuarioSesion.getRol(), super.usuarioSesion.getId());
			request.setAttribute("listaUsuarios", _listaUsuarios);
			super.dispatcher = request.getRequestDispatcher(Listener.getConfigProperties().getProperty("ruta_listar_usuarios"));
			Logger.getLogger(this.getClass()).info("El usuario " + super.usuarioSesion.getUsuario() + " está listando usuarios");
		}catch(Exception e){
			Logger.getLogger(this.getClass()).error("Excepcion generada listando usuarios");
			throw e;
		}
	}
}
